/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pbl_servidor;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.mail.EmailException;

/**
 *
 * @author Asuka
 */
public class PBL_Servidor {

    /**
     * @param args the command line arguments
     */
    //  private List<UsuarioS> listaUsers;
    private int porta;
    Integer portaCliente = 12345;
    private boolean encerrar;
    private Usuario user;
    private List<Usuario> listaUsers;
    private List<Compromisso> listaCompromissos;
    RecebedorServidor recebeServer;
    Socket cliente;
    private String DadosUsuario;
    private RecebeCliente rc;
    private List<Usuario> listaUsuariosOnline;
    private List<String> listaStatusUsuariosOnline;
    private List<Socket> listaSocketsOnline;
    private TelaServidor telaServidor;
    private Arquivo arquivo;
    private List<Usuario> listaUsuariosConvidados;
    private List<Usuario> lista2;
    private List<String> listaEmails;
    private int id_comp;
    private List<String> listaConexoesON;
    private List<Socket> listaSocketsChat;
    private ChatControlServer chat;

    public PBL_Servidor(int porta) {

        this.porta = porta;
        this.listaUsers = new ArrayList<Usuario>();
        this.listaUsuariosOnline = new ArrayList<Usuario>();
        this.listaStatusUsuariosOnline = new ArrayList<String>();
        this.listaSocketsOnline = new ArrayList<Socket>();
        this.listaCompromissos = new ArrayList<Compromisso>();
        this.listaUsuariosConvidados = new ArrayList<Usuario>();
        this.lista2 = new ArrayList<Usuario>();
        this.listaEmails = new ArrayList<String>();
        this.listaConexoesON = new ArrayList<String>();
        this.listaSocketsChat = new ArrayList<Socket>();
        this.chat = new ChatControlServer();
    }

    public static void main(String[] args) throws IOException {

        new PBL_Servidor(12345).executa();

    }

    public void executa() {

        try {

            ServerSocket servidor = new ServerSocket(this.porta);
            //telaServidor = new TelaServidor();
            System.out.println("Porta 12345 aberta!");
            //telaServidor.exibeMensagem("\nPorta 12345 aberta!\n");

            //Carrega os usuários cadastrados na memória
            this.arquivo = new Arquivo();
            this.listaUsers = arquivo.CarregaListaUsuariosDoArquivo();
            this.listaCompromissos = arquivo.CarregaListaCompromissosDoArquivo();
            this.id_comp = listaCompromissos.size();
            System.out.println("ultimo id_comp cadastrado: " + id_comp);

            if (listaUsers.size() == 0) {

                System.out.println("Lista de usuários vazia");

            } else {
                System.out.printf("Usuarios cadastrados no arquivo: ");
                for (int i = 0; i < listaUsers.size(); i++) {
                    System.out.println(listaUsers.get(i).getNome() + " - " + listaUsers.get(i).getEmail());
                    listaEmails.add(listaUsers.get(i).getEmail());
                }
            }

            if (listaCompromissos.size() == 0) {

                System.out.println("Lista de compromissos vazia");

            }

            rc = new RecebeCliente(servidor, this, listaSocketsOnline);
            new Thread(rc).start();


        } catch (IOException e) {
            System.out.println("erro3:" + e.getMessage());
        }
    }

    public void mandaMsgsCliente(String msgLidaDoCliente, Socket cli) throws InterruptedException {

        this.cliente = cli;
        DataOutputStream escrevendoProCliente = null;
        DadosUsuario = msgLidaDoCliente;

        try {

            escrevendoProCliente = new DataOutputStream(this.cliente.getOutputStream());

            if (DadosUsuario.split(":")[0].equals("CAD")) { //Cadastra usuário

                String AbraTelaLogin = "AbraTelaLogin:";

                //  System.out.println("entrei no primeiro if");

                if (listaUsers.size() == 0) {
                    
                    Usuario user = new Usuario(DadosUsuario.split(":")[1], DadosUsuario.split(":")[2], DadosUsuario.split(":")[3]);

                    listaUsers.add(user);
                    listaEmails.add(DadosUsuario.split(":")[3]);

                    arquivo.GravaListaUsuariosNoArquivo(listaUsers);
                    System.out.println("Lista de usuários atualizada no arquivo");

                    System.out.println("Tamanho da Lista de Usuarios " + listaUsers.size());
                    telaServidor.exibeMensagem("Tamanho da Lista de Usuarios " + listaUsers.size());
                    escrevendoProCliente.writeUTF(AbraTelaLogin);
                } else if (listaUsers.size() > 0) {

                    boolean forresultado = true;

                    for (int i = 0; i < listaUsers.size(); i++) {

                        Usuario usuario = (Usuario) listaUsers.get(i);
                        //    System.out.println("entrei no for");
                        if (usuario.getEmail().equals(DadosUsuario.split(":")[3])) {
                            //   System.out.println("Este email ja existe");
                            String JaExisteEsteEmail = "Este Email já esta cadastrado!:";
                            escrevendoProCliente.writeUTF(JaExisteEsteEmail);
                            System.out.println(JaExisteEsteEmail);
                            forresultado = false;
                            break;
                        }

                    }

                    if (forresultado == true) {
                        //   System.out.println("Vim pra ca");
                        Usuario user = new Usuario(DadosUsuario.split(":")[1], DadosUsuario.split(":")[2], DadosUsuario.split(":")[3]);
                        listaUsers.add(user);
                        listaEmails.add(DadosUsuario.split(":")[3]);
                        arquivo.GravaListaUsuariosNoArquivo(listaUsers);
                        atualizaCadastro();
                        System.out.println("Lista de usuários atualizada no arquivo");
                        System.out.println("Tamanho da Lista de Usuarios " + listaUsers.size());
                        escrevendoProCliente.writeUTF(AbraTelaLogin);

                    }
                }

            }

            if (DadosUsuario.split(":")[0].equals("LOGIN")) {

                boolean for2resultado = true;

                if (listaUsers.size() == 0) {
                    escrevendoProCliente.writeUTF("EsteEmailNaoEstaCadastrado:");
                }

                if (listaUsers.size() > 0) {

                    for (int i = 0; i < listaUsers.size(); i++) {

                        //Usuario userr = (Usuario) listaUsers.get(i);

                        if (listaUsers.get(i).getEmail().equals(DadosUsuario.split(":")[1])) {

                            for2resultado = false;

                            if (listaUsers.get(i).getSenha().equals(DadosUsuario.split(":")[2])) {
                                
                                this.portaCliente++;
                                String dadosConexao = DadosUsuario.split(":")[1] + "#" + cli.getInetAddress().getHostAddress() + "#" + this.portaCliente; //EMAIL#IP#PORTA
                                listaConexoesON.add(dadosConexao);
                                System.out.println("dados conexao add:" + dadosConexao); 
                                
                                escrevendoProCliente.writeUTF("AbraAgenda:".concat(listaUsers.get(i).getEmail().concat(":").concat(dadosConexao)));
                                System.out.println("Enviei pro cliente: " + "AbraAgenda:".concat(listaUsers.get(i).getEmail().concat(":").concat(dadosConexao)));
                                listaUsuariosOnline.add(listaUsers.get(i));
                                listaStatusUsuariosOnline.add("");
                                System.out.println("Usuarios online: " + listaUsuariosOnline.size());
                                //telaServidor.exibeMensagem("\nUsuarios online: " + listaUsuariosOnline.size());

                                //escrevendoProCliente.writeUTF(userr.getEmail().concat(":"));
                                listaUsers.get(i).setIPconecao(this.cliente.getInetAddress().getHostAddress());
                                listaSocketsOnline.add(this.cliente);
                                System.out.println("Tamanha da lista de socktes online: " + listaSocketsOnline.size());
                                EnviaListaCompromissosCadastrados(this.cliente);
                                AtualizaOnline();
                                atualizaCadastro();
                                EnviaConexoesON();

                            } else {
                                escrevendoProCliente.writeUTF("SenhaIncorreta:");
                            }
                        }
                    }

                    if (for2resultado == true) {
                        escrevendoProCliente.writeUTF("EsteEmailNaoEstaCadastrado:");
                    }
                }

            }//fim do if do LOGIN
            if (DadosUsuario.split(":")[0].equals("MeuStatus")) {
                modificarStatus(DadosUsuario);
            }

            if (DadosUsuario.split(":")[0].equals("CAD_COMP")) {

                System.out.println("Novo compromisso recebido do usuario " + DadosUsuario.split(":")[4]);
                System.out.println(DadosUsuario);
                this.id_comp++;
                Compromisso compromisso = new Compromisso(DadosUsuario.split(":")[1], DadosUsuario.split(":")[2], DadosUsuario.split(":")[3], DadosUsuario.split(":")[4], DadosUsuario.split(":")[5], DadosUsuario.split(":")[6], DadosUsuario.split(":")[7], DadosUsuario.split(":")[8], DadosUsuario.split(":")[9], this.id_comp);

                //SUKA, A PARTE QUE ELE PEGA O TAMANHO LISTA É ESSA: DadosUsuario.split(":")[10]. email é DadosUsuario.split(":")[11] AI AGORA TU USA COMO TU QUISER.

                int j = 1;
                for (int i = 0; i < Integer.parseInt(DadosUsuario.split(":")[10]); i++) {
                    for (int h = 0; h < listaUsers.size(); h++) {
                        String usEm = listaUsers.get(h).getEmail();
                        Usuario use = listaUsers.get(h);
                        if ((DadosUsuario.split(":")[10 + j]).equals(usEm)) {
                            listaUsuariosConvidados.add(use);
                        }
                    }

                    j++;
                }

                compromisso.setListaUsuariosConvidados(listaUsuariosConvidados);
                listaUsuariosConvidados = new ArrayList<Usuario>();
                //   System.out.println("passei");

                listaCompromissos.add(compromisso);
                arquivo.GravaListaCompromissosNoArquivo(listaCompromissos);
                System.out.println("Lista de compromissos atualizada no arquivo");
                System.out.println("Tamanho da lista de compromissos " + listaCompromissos.size());
                System.out.println("Compromisso de id = " + this.id_comp + " cadastrado");
                AtualizaListaCompromissosClientes(compromisso);
                
                //Envia email               
                Email email = new Email();             
                String msg = "Olá! Você foi convidado para um novo compromisso!\n\n" + "Criador: " + compromisso.getCriador() + "\nData: " + compromisso.getData() + "\nHorário: " + compromisso.getHoraInicio() + " às " + compromisso.getHoraTermino() + "\nLocal: " + compromisso.getLocal() + "\n\nPara mais informações, acesse sua conta através do nosso aplicativo! \n\n\nEquipe Agenda Eletônica - UEFS";
                String titulo = "Agenda Eletrônica - Você foi convidado para um novo compromisso!";
                try {
                    email.sendListaEmails(listaEmails, titulo, msg);
                } catch (EmailException ex) {
                    Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
                    System.out.println("Erro ao enviar email");
                }
            }

            if (DadosUsuario.split(":")[0].equals("CONF_COMP")) { //Um cliente confirma um compromisso

                String emailUsuario = DadosUsuario.split(":")[1];
                int idCompromisso = Integer.parseInt(DadosUsuario.split(":")[2]);
                for (int i = 0; i < listaCompromissos.size(); i++) {
                    if (listaCompromissos.get(i).getId() == idCompromisso) {
                        System.out.println("Compromisso confirmado: " + listaCompromissos.get(i).getNomeCompromisso());
                        for (int j = 0; j < listaUsers.size(); j++) {
                            if (listaUsers.get(j).getEmail().equals(emailUsuario)) {

                                for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosConfirmados().size(); k++) {
                                    System.out.println("usuario confirmado: " + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getEmail() + " email do usuario " + emailUsuario);
                                    if (listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getEmail().equals(emailUsuario)) {

                                        System.out.println("Este usuario já confirmou o compromisso!");
                                        break;
                                    }
                                }

                                this.listaCompromissos.get(i).addUsuarioConfirmado(listaUsers.get(j));
                                System.out.println("Nome do usuario que confirmou o compromisso: " + listaUsers.get(j).getNome());

                                AtualizaCompromisso("c", this.listaCompromissos.get(i));
                                break;
                            }
                        }
                    }

                }
            }

            if (DadosUsuario.split(":")[0].equals("VERIFICARUSERONLINE")) {
            }
            
            if(DadosUsuario.equals("RequisicaoCota")){
                System.out.println("Requisicao de cota");
                this.chat.solicitacaoCota(cliente);
            }


        } catch (IOException ex) {
            System.out.println("erro9:" + ex.getMessage());
        }

    }

    public synchronized void AtualizaCompromisso(String tipo, Compromisso compromisso) {
        // tipos: e = edição, c = alguém confirmou o compromisso, r = alguém recusou o compromisso;
        DataOutputStream saida = null;
        for (int b = 0; b < listaSocketsOnline.size(); b++) {

            Socket socketCliente = listaSocketsOnline.get(b);
            System.out.println("Enviando para o cliente: " + socketCliente);


            if (tipo.equals("e")) { //EDIÇÃO
            }

            if (tipo.equals("c")) { //CONFIRMAÇÃO DE  COMPROMISSO

                try {
                    saida = new DataOutputStream(socketCliente.getOutputStream());
                    String confirmados = new String();
                    for (int i = 0; i < compromisso.getListaUsuariosConfirmados().size(); i++) {
                        System.out.println("usuarios confirmados nesse compromisso = " + compromisso.getListaUsuariosConfirmados().get(i).getNome());

                        if (i == compromisso.getListaUsuariosConfirmados().size() - 1) {
                            confirmados = confirmados + compromisso.getListaUsuariosConfirmados().get(i).getNome() + " - " + compromisso.getListaUsuariosConfirmados().get(i).getEmail();
                        } else {
                            confirmados = confirmados + compromisso.getListaUsuariosConfirmados().get(i).getNome() + " - " + compromisso.getListaUsuariosConfirmados().get(i).getEmail() + "#";
                        }
                    }

                    String dadosConfirmacao = "CONFIRMACAO_COMP:" + compromisso.getId() + ":" + confirmados;
                    System.out.println("dados confirmacao = " + dadosConfirmacao);
                    saida.writeUTF(dadosConfirmacao);
                } catch (IOException ex) {
                    Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
                }

                if (listaSocketsOnline.isEmpty()) {
                    System.out.println("Nenhum usuário conectado");
                    //telaServidor.exibeMensagem("Nenhum usuário conectado\n");
                }

            }

            if (tipo.equals("r")) { //RECUSA DE COMPROMISSO
            }

        }


    }

    public synchronized void modificarStatus(String status) {
        String usuario = status.split(":")[1];
        String statusUser = status.split(":")[2];
        int size = listaUsuariosOnline.size();
        for (int i = 0;i<size;i++) {
            Usuario usuarioOnline = listaUsuariosOnline.get(i);
            if(usuarioOnline.getEmail().equalsIgnoreCase(usuario))
                listaStatusUsuariosOnline.set(i, statusUser);
        }
        AtualizaOnline();
    }

    public synchronized void atualizaCadastro() {
        System.out.println("Tamanha da lista de socktes online: " + listaSocketsOnline.size());
        for (int b = 0; b < listaSocketsOnline.size(); b++) {
            DataOutputStream g = null;

            try {
                Socket socket = listaSocketsOnline.get(b);
                System.out.println("esta mandando para cliente: " + socket);

                g = new DataOutputStream(socket.getOutputStream());
                if (listaSocketsOnline.isEmpty()) {
                    System.out.println("Nenhum Usuario Conectado!!!");
                    //telaServidor.exibeMensagem("Nenhum Usuario Conectado!!!\n");
                }
                String clientesCadastradosStr = "";
                for (int i = 0; i < listaUsers.size(); i++) {

                    if (i == listaUsers.size() - 1) {
                        String email = "USERCADASTRADO:".concat(listaUsers.get(i).getEmail().concat(":".concat("FIMVERIFICACADASTRADOS:")));
                        g.writeUTF(email);
                        //System.out.println("ahuaheuae2222" + email);
                    } else {
                        String email = "USERCADASTRADO:".concat(listaUsers.get(i).getEmail().concat(":"));
                        g.writeUTF(email);
                        // System.out.println("AHUAHEUAE2222" + email);
                    }
                }
            } catch (IOException ex) {
                System.out.println("Erro em AtualizCadastro");
                Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public synchronized void EnviaConexoesON(){
        String conexoesON = ":";
        String qntConexoes = Integer.toString(listaConexoesON.size());
        
        if (listaSocketsOnline.isEmpty()){
           System.out.println("Lista de conexõesON está vazia");
        }
        else{
          for (int i = 0; i < listaConexoesON.size(); i++){
              conexoesON = conexoesON + listaConexoesON.get(i) + ":";
          }
        }    
        
        System.out.println("ConexoesON = " + conexoesON);
        
        for (int j = 0; j < listaSocketsOnline.size(); j++){
            try {
                Socket clienteSock = listaSocketsOnline.get(j);
                DataOutputStream saida = new DataOutputStream(clienteSock.getOutputStream());
                if(listaSocketsOnline.isEmpty() == false){
                    System.out.println("Enviando conexoesON para o socket: " + clienteSock.getInetAddress().toString());
                    saida.writeUTF("conexoesON:" + qntConexoes + conexoesON);
                }
            } catch (IOException ex) {
                Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public synchronized void AtualizaListaCompromissosClientes(Compromisso compromisso) { //envia a lista de compromissos pra ser exibida na tela principal
        System.out.println("Tamanha da lista de socktes online: " + listaSocketsOnline.size());
        System.out.println("Enviando novo compromisso cadastrado para os usuários online... ");
        for (int b = 0; b < listaSocketsOnline.size(); b++) {
            DataOutputStream saida = null;

            try {
                Socket socketCliente = listaSocketsOnline.get(b);
                System.out.println("Enviando para o cliente: " + socketCliente);

                saida = new DataOutputStream(socketCliente.getOutputStream());

                if (listaSocketsOnline.isEmpty()) {
                    System.out.println("Nenhum usuário conectado");
                    //telaServidor.exibeMensagem("Nenhum usuário conectado\n");
                }
                String convidados = new String();
                String confirmados = new String();
                String recusaram = new String();

                for (int k = 0; k < compromisso.getListaUsuariosConvidados().size(); k++) {

                    System.out.println("Convidado:" + compromisso.getListaUsuariosConvidados().get(k).getNome());
                    if (k == compromisso.getListaUsuariosConvidados().size() - 1) {
                        convidados = convidados + compromisso.getListaUsuariosConvidados().get(k).getNome() + " - " + compromisso.getListaUsuariosConvidados().get(k).getEmail();
                    } else {
                        convidados = convidados + compromisso.getListaUsuariosConvidados().get(k).getNome() + " - " + compromisso.getListaUsuariosConvidados().get(k).getEmail() + "#";
                    }
                }

                for (int k = 0; k < compromisso.getListaUsuariosConfirmados().size(); k++) {
                    System.out.println("Confirmado:" + compromisso.getListaUsuariosConfirmados().get(k).getNome());
                    if (k == compromisso.getListaUsuariosConfirmados().size() - 1) {
                        confirmados = confirmados + compromisso.getListaUsuariosConfirmados().get(k).getNome() + " - " + compromisso.getListaUsuariosConfirmados().get(k).getEmail();
                    } else {
                        confirmados = confirmados + compromisso.getListaUsuariosConfirmados().get(k).getNome() + " - " + compromisso.getListaUsuariosConfirmados().get(k).getEmail() + "#";
                    }
                }

                if (confirmados.isEmpty()) {
                    confirmados = null;
                }

                for (int k = 0; k < compromisso.getListaUsuariosRecusaram().size(); k++) {

                    System.out.println("Recusou:" + compromisso.getListaUsuariosRecusaram().get(k));
                    if (k == compromisso.getListaUsuariosRecusaram().size() - 1) {
                        recusaram = recusaram + compromisso.getListaUsuariosRecusaram().get(k).getNome() + " - " + compromisso.getListaUsuariosRecusaram().get(k).getEmail();
                    } else {
                        recusaram = recusaram + compromisso.getListaUsuariosRecusaram().get(k).getNome() + " - " + compromisso.getListaUsuariosRecusaram().get(k).getEmail() + "#";
                    }
                }

                if (recusaram.isEmpty()) {
                    recusaram = null;
                }

                String dadosCompromisso = "DADOS_NOVO_COMPROMISSO:" + compromisso.getData() + ":" + compromisso.getHoraInicio() + ":" + compromisso.getHoraTermino() + ":" + compromisso.getCriador() + ":" + compromisso.getNomeCompromisso() + ":" + compromisso.getLocal() + ":" + compromisso.getDescricaoCompromisso() + ":" + compromisso.getTipoCompromisso() + ":" + compromisso.getNomeAnexo() + ":" + convidados + ":" + confirmados + ":" + recusaram + ":" + compromisso.getId();
                saida.writeUTF(dadosCompromisso);
                System.out.println("Dados do último compromisso cadastrado enviado: " + dadosCompromisso);

            } catch (IOException ex) {
                Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        System.out.println("Compromissos cadastrados enviados para todos os clientes online");
    }

    public synchronized void EnviaListaCompromissosCadastrados(Socket clienteLogado) {
        System.out.println("Enviando lista de compromissos para um usuário que acabou de entrar...");
        DataOutputStream saida;
        try {
            saida = new DataOutputStream(clienteLogado.getOutputStream());
            for (int i = 0; i < listaCompromissos.size(); i++) {
                String convidados = new String();
                String confirmados = new String();
                String recusaram = new String();
                if (i == listaCompromissos.size() - 1) {

                    for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosConvidados().size(); k++) {
                        System.out.println("Convidado:" + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getNome());
                        if (k == listaCompromissos.get(i).getListaUsuariosConvidados().size() - 1) {
                            convidados = convidados + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getEmail();
                        } else {
                            convidados = convidados + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getEmail() + "#";
                        }
                    }

                    for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosConfirmados().size(); k++) {
                        System.out.println("Confirmado:" + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getNome());
                        if (k == listaCompromissos.get(i).getListaUsuariosConfirmados().size() - 1) {
                            confirmados = confirmados + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getEmail();
                        } else {
                            convidados = convidados + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getEmail() + "#";
                        }
                    }

                    if (confirmados.isEmpty()) {
                        confirmados = "null";
                    }

                    for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosRecusaram().size(); k++) {
                        System.out.println("Recusou:" + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getNome());
                        if (k == listaCompromissos.get(i).getListaUsuariosRecusaram().size() - 1) {
                            recusaram = recusaram + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getEmail();
                        } else {
                            recusaram = recusaram + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getEmail() + "#";
                        }
                    }

                    if (recusaram.isEmpty()) {
                        recusaram = "null";
                    }

                    //System.out.println("Convidados do compromisso: " + convidados);   
                    String dadosCompromisso = "DADOS_COMPROMISSOS:" + listaCompromissos.get(i).getData() + ":" + listaCompromissos.get(i).getHoraInicio() + ":" + listaCompromissos.get(i).getHoraTermino() + ":" + listaCompromissos.get(i).getCriador() + ":" + listaCompromissos.get(i).getNomeCompromisso() + ":" + listaCompromissos.get(i).getLocal() + ":" + listaCompromissos.get(i).getDescricaoCompromisso() + ":" + listaCompromissos.get(i).getTipoCompromisso() + ":" + listaCompromissos.get(i).getNomeAnexo() + ":" + convidados + ":" + confirmados + ":" + recusaram + ":" + listaCompromissos.get(i).getId() + ":" + "FIM_COMPROMISSOS";
                    saida.writeUTF(dadosCompromisso);
                    System.out.println("Dados do último compromisso da lista enviado: " + dadosCompromisso);
                } else {

                    for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosConvidados().size(); k++) {
                        convidados = convidados + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getEmail() + "#";
                        System.out.println("Convidado:" + listaCompromissos.get(i).getListaUsuariosConvidados().get(k).getNome());
                    }

                    for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosConfirmados().size(); k++) {
                        confirmados = confirmados + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getEmail() + "#";
                        System.out.println("Confirmado:" + listaCompromissos.get(i).getListaUsuariosConfirmados().get(k).getNome());
                    }

                    if (confirmados.isEmpty()) {
                        confirmados = null;
                    }

                    for (int k = 0; k < listaCompromissos.get(i).getListaUsuariosRecusaram().size(); k++) {
                        recusaram = recusaram + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getNome() + " - " + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getEmail() + "#";
                        System.out.println("Recusou:" + listaCompromissos.get(i).getListaUsuariosRecusaram().get(k).getNome());
                    }

                    if (recusaram.isEmpty()) {
                        recusaram = null;
                    }

                    //System.out.println("Convidados do compromisso: " + convidados);
                    String dadosCompromisso = "DADOS_COMPROMISSOS:" + listaCompromissos.get(i).getData() + ":" + listaCompromissos.get(i).getHoraInicio() + ":" + listaCompromissos.get(i).getHoraTermino() + ":" + listaCompromissos.get(i).getCriador() + ":" + listaCompromissos.get(i).getNomeCompromisso() + ":" + listaCompromissos.get(i).getLocal() + ":" + listaCompromissos.get(i).getDescricaoCompromisso() + ":" + listaCompromissos.get(i).getTipoCompromisso() + ":" + listaCompromissos.get(i).getNomeAnexo() + ":" + convidados + ":" + confirmados + ":" + recusaram + ":" + listaCompromissos.get(i).getId();
                    saida.writeUTF(dadosCompromisso);
                    System.out.println("Dados do compromisso enviado: " + dadosCompromisso);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public synchronized void AtualizaOnline() {
        System.out.println("Tamanho da lista de sockets on em AtualizaOnline: " + listaSocketsOnline.size());
        for (int k = 0; k < listaSocketsOnline.size(); k++) {
            DataOutputStream f = null;

            try {
                Socket socket = listaSocketsOnline.get(k);
                System.out.println("esta mandando para: " + socket);
                f = new DataOutputStream(socket.getOutputStream());
                if (listaSocketsOnline.isEmpty()) {
                    System.out.println("Nenhum Usuario Conectado!");
                    f.writeUTF("NenhumUsuarioConectado:");

                    //telaServidor.exibeMensagem("Nenhum Usuario Conectado!!!\n");
                }
                for (int i = 0; i < listaUsuariosOnline.size(); i++) {

                    if (i == listaUsuariosOnline.size() - 1) {
                        String email = "USERONLINE:".concat(listaUsuariosOnline.get(i).getEmail().concat("-").concat(listaStatusUsuariosOnline.get(i)).concat(":".concat("FIMVERIFICAONLINE:")));
                        f.writeUTF(email);
                        System.out.println("Msg enviada de USERONLINE: " + email);
                    } else {
                        String email = "USERONLINE:".concat(listaUsuariosOnline.get(i).getEmail().concat("-").concat(listaStatusUsuariosOnline.get(i)).concat(":"));
                        f.writeUTF(email);
                        System.out.println("Msg enviada de USERONLINE: " + email);
                    }
                }
            } catch (IOException ex) {
                System.out.println("Erro em AtualizaOnline");
                Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
//
//    public synchronized void pingar(Socket cliente1) {
//        try {
//            String ip = cliente1.getInetAddress().getHostAddress();
//            if (InetAddress.getByName(ip).isReachable(2000)) {
//                System.out.println("Ainda online: " + ip);
//            } else {
//                System.out.println("offline: " + ip);
//            }
//        } catch (IOException ex) {
//            Logger.getLogger(PBL_Servidor.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }

    public synchronized void MandaQuemEstaOFF(String dado) {
        //   DataOutputStream escreve = null;

        String dd = dado;

        if (!listaSocketsOnline.isEmpty()) {
            for (int i = 0; i < listaSocketsOnline.size(); i++) {
                Socket cliente = listaSocketsOnline.get(i);
                //   escreve = new DataOutputStream(cliente.getOutputStream());
                if (dado.split(":")[0].equals("OFFLINE")) {
                    for (int j = 0; j < listaUsuariosOnline.size(); j++) {
                        String ipUser = listaUsuariosOnline.get(j).getIPconexao();
                        String email = listaUsuariosOnline.get(j).getEmail();
                        if (ipUser.equals(dd.split(":")[1])) {
                            listaUsuariosOnline.remove(j);
                            listaStatusUsuariosOnline.remove(j);
                            //System.out.println("entreiIIIIII");
                            //   escreve.writeUTF("USEROFFLINE:".concat(email.concat(":")));
                            AtualizaOnline();
                        }
                    }
                }//fim do if
            }
        }

    }
}
